/************************************************************************
** 文  件：
**	IDbBase.h
** 功  能：
**	提供数据库操作基本接口封装
** 作  者：
**	email:lixx2048@163.com
**  wechat:lixiang6153
**  QQ:941415509
** 日  期：
**	2020/10/15	14:00:00
** 说  明：
**	无
** 版  本：
**	2020/10/15	14:00:00		1.0		lixx2048@163.com
/************************************************************************/
#pragma once
#include <string>
#include <thread>
#include <functional>
#include <mutex>
#include <chrono>
#include <memory>

class IDbBase
{
public:
	IDbBase(void);
	virtual ~IDbBase(void);

public:
	// 设置数据库类型
	void SetDbType(int nType);
	// 获取数据库类型
	int GetDbType() const;

	// 打开数据库
	virtual bool Open(const char* ip, int port, const char* user, const char* pwd, const char* name) = 0;
	// 关闭数据库
	virtual void Close(void) = 0;

	// 创建表
	virtual bool IsTableExist(const char* tbname) = 0;
	virtual bool CreateTable(const char* sql) = 0;
	virtual bool Exec(const char* sql) = 0;

	// 创建存储过程
	virtual bool IsProcedureExist(const char* dbname, const char* procname) = 0;
	virtual bool CreateProcedure(const char* sql) = 0;

	// 插入并获取自动生成的ID,失败返回-1
	// 否则为成功，如果该表没有AUTO_INCREMENT列则成功时返回0，
	// 反之则返回>0的非-1值)
	virtual uint64_t Insert(const char* sql) = 0;
	virtual const char* GetErrorMessage() = 0;

	// 删除行
	virtual bool Delete(const char* sql) = 0;

	// 更新数据
	virtual bool Update(const char* sql) = 0;

	// 查询(每次成功查询完后都要调FreeQueryResult()释放查询结果缓存)
	virtual bool Query(const char* sql) = 0;

	// 释放查询结果m_pResult(每次成功查询完后都要调FreeQueryResult()释放查询结果缓存)
	virtual void FreeQueryResult(void) = 0;

	// 读取下一行数据给m_ppRecord/m_pVM(先查询才能读取)
	virtual bool FetchNextRow(void) = 0;

	// 获取行数(先查询才能获取)
	virtual long GetRowCount() = 0;

	// 获取列数(先查询才能获取)
	virtual int GetColCount() = 0;

	// 获取当前行的某列数据(先查询才能获取)
	virtual char* GetColValue(int nCol) = 0;

public:
	// 0：mysql 1：sqlite
	int         m_nDbType;

protected:
	std::mutex 		m_lock;
	std::string		m_szDbIp;
	std::string		m_szDbUser;
	std::string		m_szDbPwd;
	std::string		m_szDbName;
	int				m_usDbPort;
	long			m_ullRow;
	int				m_nCol;
};

typedef std::shared_ptr<IDbBase> IDbBasePtr;